/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "stdafx.h"
#include "工作区.h"


#include "A_引擎/引擎.h"
#include "框架/工作区/节点视口/ui节点面板.h"


#include "视频图像视口/视频图像工作区.h"
#include "时间轴视口/曲线视口工作区.h"
#include "时间轴视口/时间轴视口工作区.h"
#include "表格视口/表格工作区.h"
#include "节点视口/节点视口工作区.h"
#include "2D视口/2D视口工作区.h"
#include "3D工作区/3D视口工作区.h"
#include "大纲/大纲工作区.h"

#include "物体管理/渲染物体约束更新.h"



static void on_帮助框布局(C_Widget* self, C_Widget** w, uint32 num) {
	
}

static void on_帮助框绘制(C_Widget* self, S_2D画布* 画布) {
	//属性面板.m_背景 = f_vg_drawConvexElement(画布, E_填充模式::e_填充面, E_图层混合模式::e_Normal);
}

static void on_帮助框变换(C_Widget* self) {

	S_GPU内存块* 形状[1] = { &S_2D画布::g预设_下圆角矩形 };
	S_2DConvexRect rect;
	//rect.offset = {};
	//rect.size = self->m_Size;
	//rect.radius = { S_UI主题::ui_面板圆角半径, S_UI主题::ui_面板圆角半径 };
	//rect.color_type = { f_PackData4X8(S_UI主题::uic_深灰), 0 };
	//f_vg_setElementRect(self->m_画布, 属性面板.m_背景, 1, 形状, &rect);
}




static void on_状态栏绘制(C_Widget* self, S_2D画布* 画布) {
	C_工作区_工具条& 属性面板 = *dynamic_cast<C_工作区_工具条*>(self);
	//属性面板.m_背景 = f_vg_drawConvexElement(画布, E_填充模式::e_填充面, E_图层混合模式::e_Normal);
}

static void on_状态条变换(C_Widget* self) {
	C_工作区_工具条& 属性面板 = *dynamic_cast<C_工作区_工具条*>(self);
	
	S_GPU内存块* 形状[1] = { &S_2D画布::g预设_下圆角矩形 };
	S_2DConvexRect rect;
	//rect.offset = {};
	//rect.size = self->m_Size;
	//rect.radius = { S_UI主题::ui_面板圆角半径, S_UI主题::ui_面板圆角半径 };
	//rect.color_type = { f_PackData4X8(S_UI主题::uic_深灰), 0 };
	//f_vg_setElementRect(self->m_画布, 属性面板.m_背景, 1, 形状, &rect);
}


C_工作区_工具条::C_工作区_工具条(S_UI渲染环境& ctx) : C_Widget(&ctx) {
	f_setSize({ 24, 24 });

	mf_绘制 = on_状态栏绘制;
	mf_变换 = on_状态条变换;
}






static void on_工作区绘制(C_Widget* self, S_2D画布* 画布) {
	C_工作区页面& 属性面板 = *dynamic_cast<C_工作区页面*>(self);
	
	//属性面板.m_背景 = f_vg_drawConvexElement(画布, E_填充模式::e_填充面, E_图层混合模式::e_Normal);
}

static void on_工作区布局(C_Widget* self, C_Widget** w, uint32 num) {
	C_工作区页面& 工作区 = *dynamic_cast<C_工作区页面*>(self);

	
	float32 状态栏厚度 = 24 * self->m_UIctx->m_DPI;
	float32 h = max(self->m_Size.y - 状态栏厚度, 1);

	
	//属性栏
	C_属性栏* 属性栏 = static_cast<C_属性栏*>(w[1]);
	属性栏->f_设置宽度(属性栏->m_View->m_手柄->m_Pos.x);
	属性栏->f_setH(h + 1);
	//w[1]->f_setPos({ 0, 0 });
	

	//状态条
	w[2]->f_setPos({ 0, h });
	w[2]->f_setW(self->m_Size.x);
	w[2]->f_setH(状态栏厚度);

	//页面
	w[0]->f_setPos({ 属性栏->m_Size.x,0 });
	w[0]->f_setSize({ self->m_Size.x - 属性栏->m_Size.x, h + 1 });

}

static void on_工作区变换(C_Widget* self) {
	C_工作区页面& 属性面板 = *dynamic_cast<C_工作区页面*>(self);
	
}



C_工作区页面::C_工作区页面(E_工作区类型 类型, S_UI渲染环境& ctx, E_方向 方向, C_Widget* 默认页面, C_状态条* 状态条, C_属性栏* 属性栏) : C_Widget(&ctx), m_工作区类型(类型) {
	m_TypeName = "工作区页面";
	mui_视口页面 = 默认页面;
	m_是否延展 = { true, true };
	mui_状态条 = 状态条;
	mui_属性栏 = 属性栏;

	mf_布局 = on_工作区布局;
	mf_绘制 = on_工作区绘制;
	mf_变换 = on_工作区变换;
	
	//S_框架::m_工作区视口渲染层ID分配.f_置组件渲染层(this);


	f_添加子组件(默认页面);

	if (nullptr == mui_属性栏) {
		mui_属性栏 = new C_属性栏(ctx);
	}
	f_添加子组件(mui_属性栏);



	if (nullptr == 状态条) {
		f_添加子组件( new C_工作区_工具条(ctx));
	}
	else {
		f_添加子组件(状态条);
	}
}

uint16 C_工作区页面::f_add工作区页面(C_Widget* page, std::string name, std::string ico) {
	return uint16();
}

void C_工作区页面::f_del工作区页面(uint16 id) {

}


C_Widget* f_工作区_get页面(C_Widget* 工作区, uint16 id) {
	return f_ui_get选项夹页面(工作区, id);
}





static C_工作区页面* g_文本编辑器 = nullptr;
static fp_工作区联动更新 g_文本编辑器fu = nullptr;


static void f_页面_更新状态条(E_工作区操作类型 操作类型) {
	switch (操作类型) {
		case e_所有:
			break;
		case e_拾取物体:
			break;
		case e_创建物体:
			break;
		case e_删除物体:
			break;
		case e_变换物体:
			break;
		case e_更新节点:
			break;
		case e_选择节点:

			break;
		case e_创建节点:
			break;
		case e_删除节点:
			break;

		case E_工作区操作类型::e_创建场景节点: 
		case E_工作区操作类型::e_创建物体节点: {
			f_节点视口工作区_更新当前引用节点();
			f_3D视口工作区_更新所有视口属性面板();
			f_大纲视图页面_重构大纲绘制();
			break;
		}
		case E_工作区操作类型::e_修改节点名称: {
			f_节点视口工作区_更新当前引用节点();
			f_3D视口工作区_更新所有视口属性面板();
			f_大纲视图页面_重构大纲绘制();
			break;
		}
		case E_工作区操作类型::e_切换物体节点: {
			f_节点视口工作区_更新当前引用节点();
			f_3D视口工作区_更新所有视口属性面板();
			f_大纲视图页面_重构大纲绘制();
			break;
		}
		default:
			break;
	}
}

static void f_页面_更新属性面板(E_工作区操作类型 操作类型) {
	switch (操作类型) {
		case e_所有:
			break;
		case e_拾取物体:
			break;
		case e_创建物体:
			break;
		case e_删除物体:
			break;
		case e_变换物体:
			break;
		case e_更新节点:
			break;
		case e_选择节点:

			break;
		case e_创建节点:
			break;
		case e_删除节点:
			break;

		case E_工作区操作类型::e_修改节点名称: {
			//f_节点视口工作区_更新当前引用节点();
			break;
		}
		default:
			break;
	}
}


void f_页面_绑定工作区更新回调(E_工作区类型 工作区类型, fp_工作区联动更新 函数指针, C_工作区页面* 工作区) {
	switch (工作区类型) {
	case e_3D视口:
		break;
	case e_视频图像:
		break;
	case e_时间轴:
		break;
	case e_节点视口:
		break;
	case e_文本编辑视口:
		g_文本编辑器fu = 函数指针;
		g_文本编辑器 = 工作区;
		break;
	default:
		break;
	}
}

void f_工作区_联动更新(E_工作区类型 工作区类型, E_工作区操作类型 操作类型) {
	
	switch (工作区类型) {
		case e_3D视口: {
			if (操作类型 == E_工作区操作类型::e_创建物体) {
				
			}
			f_3D视口工作区_更新所有视口组件绘制();

			switch (操作类型) {
				case e_所有:
					break;
				
				case E_工作区操作类型::e_创建物体:
				case E_工作区操作类型::e_删除物体:
					f_物体约束_更新拾取物体变换();
				case E_工作区操作类型::e_拾取物体:
					f_3D视口工作区_置物体焦点();
					break;
				case E_工作区操作类型::e_变换物体:
					break;
				case E_工作区操作类型::e_更新节点:
					break;
				case E_工作区操作类型::e_选择节点:
					break;
				case E_工作区操作类型::e_删除节点:
					break;

				case E_工作区操作类型::e_创建物体节点: {
					f_节点视口工作区_更新当前引用节点();
					break;
				}
				case E_工作区操作类型::e_创建场景节点: {
					
					break;
				}
				
				default:
					break;
			}

			C_节点面板* 钉住节点面板 = f_global_get钉住节点();
			if (钉住节点面板) {
				
			}
			else {
				f_曲线视口工作区_设置当前编辑物体();
			}
			
			f_大纲视图页面_联动更新(E_工作区类型::e_3D视口, 操作类型);
			f_2D编辑视口页面_联动更新();
			f_节点工作区页面_联动更新(E_工作区类型::e_3D视口, 操作类型);
			break;
		}
		case E_工作区类型::e_2D视口: {
			f_2D编辑视口页面_联动更新();
			break;
		}
		case E_工作区类型::e_曲线视口: {
			f_时间轴页面_联动更新();
			f_表格视口页面_联动更新();
			f_2D编辑视口页面_联动更新();
			break;
		}
		case E_工作区类型::e_视频图像: {
		
			break;
		}
	
		case E_工作区类型::e_时间轴: {
			f_曲线视口页面_联动更新();
			f_表格视口页面_联动更新();
			break;
		}
		case E_工作区类型::e_节点视口: {
			f_曲线视口工作区_设置当前编辑节点();
			f_表格视口页面_设置当前节点数据();
			f_视频图像页面_联动更新();
			f_时间轴页面_联动更新();

			f_大纲视图页面_联动更新(E_工作区类型::e_节点视口, 操作类型);
			break;
		}
		case E_工作区类型::e_大纲视口: {
			f_3D视口工作区_更新所有视口组件绘制();

			switch (操作类型) {
				case e_所有:
					break;
				case e_拾取物体:
					f_3D视口工作区_置物体焦点();
					break;
				case e_创建物体:
					break;
				case e_删除物体:
					break;
				case e_变换物体:
					break;
				case e_更新节点:
					break;
				case e_选择节点:
					
					break;
				case e_创建节点:
					break;
				case e_删除节点:
					break;
				default:
					break;
			}
			
			f_大纲视图页面_刷新大纲绘制();
			break;
		}

		case E_工作区类型::e_文本编辑视口: {
			break;
		}
		case E_工作区类型::e_表格视口: {
			break;
		}

		case E_工作区类型::e_属性面板: {
			f_页面_更新状态条(操作类型);
			break;
		}
		case E_工作区类型::e_状态条: {
			f_页面_更新状态条(操作类型);
			break;
		}
		default:
			break;
	}
}

void f_页面_渲染层配置(C_工作区页面* 工作区页面, bool 添加) {
	if (添加) {
		S_框架::m_工作区视口渲染层ID分配.f_置组件渲染层(工作区页面->mui_视口页面);
		S_框架::m_工作区属性面板渲染层ID分配.f_置组件渲染层(工作区页面->mui_属性栏);
		S_框架::m_工作区属性面板渲染层ID分配.f_置组件渲染层(工作区页面->mui_状态条);
	}
	else {
		S_框架::m_工作区视口渲染层ID分配.f_移除渲染层组件(工作区页面->mui_视口页面);
		S_框架::m_工作区属性面板渲染层ID分配.f_移除渲染层组件(工作区页面->mui_属性栏);
		S_框架::m_工作区属性面板渲染层ID分配.f_移除渲染层组件(工作区页面->mui_状态条);
	}
}







